<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie du plugin «Album» pour Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

class generateurAlbum extends cpGenerateur
{
	
	
	
	
	
	/// @name Administration
	//@{
	
	
	protected $tab;
	
	
	public function preparerModule($module)
	{
		
		switch($_GET['tab']):
			case ajoutImages:
				$this->tab = 'ajoutImages';
				
				$module->setPrev('modifierPage&page_id='.$this->page->page_id, 'Éditer la page');
				$module->setJavascript('modifierPage_album_ajoutImages');
				
				# Instance de cpListeMedias
				$this->listeMedias = new pAlbumListeMedias($this->core);
				$this->listeMedias->module = 'modifierPage';
				$this->listeMedias->url = 'index.php?module=modifierPage&page_id='.$this->page->page_id.'&tab=ajoutImages';
				$this->listeMedias->formExtras = form::hidden('page_id', $this->page->page_id).form::hidden('tab', 'ajoutImages');
				$this->listeMedias->medias_album = $this->page->page_options['medias'];
				$this->listeMedias->filtres();
				break;
			
			case organiserImages:
				$this->tab = 'organiserImages';
				
				$module->setPrev('modifierPage&page_id='.$this->page->page_id, 'Éditer la page');
				$module->setJavascript('modifierPage_album_organiserImages');

				if($this->page->peutModifier()) {
					$module->ajouterBoutonAction(__('Enregistrer'), '#', 'boutonAction_organiser');
					
					# Actions autorisées
					$module->setActionsAutorisees('organiserImages');
				}
				
				break;
				
			default:
				$this->tab = 'general';

				$module->setJavascript('modifierPage,modifierPage_album_general');
				
				if($this->page->peutModifier()) {
					
					# Boutons d'action			
					if($this->core->auth->verifierPermission('publierPage')) {
						$module->ajouterBoutonAction(__('Publier'), '#', 'boutonAction_publier');
					}
					$module->ajouterBoutonAction(__('Enregistrer comme brouillon'), '#', 'boutonAction_enregistrer');
			
					
					# Actions autorisées
					$module->setActionsAutorisees(
						'enregistrerPage',
						'publierPage',
						'restaurerPage'
					);
					
				}
				
				# Bouton d'action «Aperçu»
				$module->ajouterBoutonAction(__('Aperçu'), '#', 'boutonAction_apercu');
				
				break;
				
		endswitch;
		
		$module->setCSS('modifierPage,modifierPage_album');
		
	}
	
	
	public function action_enregistrerPage($module)
	{
		
		if($this->page->page_id != $_POST['page_id']) {
			throw new cpErreur(__('Donnée invalide').' (page_id)', 'page_id', 301);
		}
		
		# Début de la transaction
		$this->core->con->begin();
		
		try {
		
			# Vérification des données
			if(!is_numeric($_POST['miniature_taille'])) {
				throw new cpErreur(__('Vous devez indiquer une valeur numérique'), 'miniature_taille', 107);
			}
			
			if(!is_numeric($_POST['image_taille'])) {
				throw new cpErreur(__('Vous devez indiquer une valeur numérique'), 'image_taille', 107);
			}
			
			if(!is_numeric($_POST['images_par_page'])) {
				throw new cpErreur(__('Vous devez indiquer une valeur numérique'), 'images_par_page', 107);
			}
			
			# Curseur
			$cur = $this->core->con->openCursor($this->core->prefix.'temp_pages');
			
			# Propriétés communes à toutes les pages
			$this->adminProprietesEnregistrer($cur, $_POST);
			
			# Traiter le contenu
			$page_entete = $_POST['page_entete'];
			$page_entete_xhtml = '';
			$this->adminTraiterContenu($page_entete, $page_entete_xhtml, $cur->page_options['cp']['format']);
			$cur->page_entete		= $page_entete;
			$cur->page_entete_xhtml	= $page_entete_xhtml;
			
			# Autres propriétés
			$cur->page_titre		= $_POST['page_titre'];
			$page_options			= $cur->page_options;
			$page_options['medias']	= $this->page->page_options['medias'];
			$page_options['miniature_taille'] 	= (integer) $_POST['miniature_taille'];
			$page_options['image_taille']		= (integer) $_POST['image_taille'];
			$page_options['images_par_page']	= (integer) $_POST['images_par_page'];
			$page_options['miniature_titre']	= (boolean) $_POST['miniature_titre'];
			$page_options['cp']['medias']		= $this->medias;
			$cur->page_options		= $page_options;
			
			# Enregistrer
			$this->page->enregistrer($cur);
			$module->messageOK(__('Album enregistré avec succès.'));
		
			# Fin de la transaction
			$this->core->con->commit();
		} catch(Exception $e) {
			$this->core->con->rollback();
			throw $e;
		}
			
	}
	
	
	public function action_publierPage($module)
	{
		
		# Permission nécessaire: publierPage
		$this->core->auth->verifierPermission('publierPage', true);
		
		# Enregistrer les modifications
		$this->action_enregistrerPage($module);
		
		# Publier la page
		$this->page->publier();
		
		$module->messageOK(__('Album publié avec succès.'));
	
	}
		
	
	public function action_restaurerPage($module)
	{
		$this->page->restaurer();
		$module->messageOK(__('Album restauré avec succès.'));
	}
	
	
	public function action_organiserImages($module)
	{
		$medias = array();
		
		if(is_array($_POST['media_id']) && count($_POST['media_id']) != 0) {

			foreach($_POST['media_id'] as $media_id)
			{
				$media = $this->core->site->getMedias(array('media_id' => (integer) $media_id), CP_GET_RS);
				
				if(!$media->isEmpty() && preg_match('/^image/', $media->media_type)) {
					$medias[] = (integer) $media->media_id;
				}
			}
		}
		
		$page_options = $this->page->page_options;
		$page_options['medias'] = $medias;
		
		# Curseur
		$cur = $this->core->con->openCursor($this->core->prefix.'temp_pages');
		$cur->page_options = $page_options;
		
		# Enregistrer
		$this->page->enregistrer($cur);

		$this->messageOK(__('Album enregistré avec succès.'));
	}
	
	
	public function adminBody($module)
	{

		switch($this->tab):
		
		case general:

			# Valeur des champs de formulaire
			if(!$module->erreursFormulairePresentes())
			{
				$miniature_taille 	= (integer) $this->page->page_options['miniature_taille'];
				$image_taille 		= (integer) $this->page->page_options['image_taille'];
				$images_par_page 	= (integer) $this->page->page_options['images_par_page'];
				$miniature_titre 	= (boolean) $this->page->page_options['miniature_titre'];
				$page_titre 		= $this->page->page_titre;		
				$page_entete 		= $this->page->page_entete == '' ?
					$this->page->page_entete_xhtml :
					$this->page->page_entete;
			}
			else
			{		
				$miniature_taille 	= (integer) $_POST['miniature_taille'];
				$image_taille 		= (integer) $_POST['image_taille'];
				$images_par_page 	= (integer) $_POST['images_par_page'];
				$miniature_titre 	= (boolean) $_POST['miniature_titre'];
				$page_titre 		= $_POST['page_titre'];
				$page_entete		= $_POST['page_entete'];
			}
			
			# HTML de l'interface
			$html =
				'<form id="modifierPage" method="post" action="index.php?module=modifierPage&page_id='.$this->page->page_id.'&tab=general" autocomplete="off">'.
					form::hidden('page_id', $this->page->page_id).
					form::hidden('nonce_enregistrer', $this->core->genererNonce('enregistrerPage')).
					form::hidden('nonce_publier', $this->core->genererNonce('publierPage')).
					form::hidden('nonce', '').
					form::hidden('action', '').
					form::hidden('apercu', '').
					'<div id="modifierPage_gauche">'.
						$module->afficherMessages().
						'<fieldset><legend>'.__('Album').'</legend>'.
						'<p class="onTop">'.
							'<label for="page_images">'.__('Images').'</label>'.
							sprintf(__('Cet album contient %s image(s).'), count($this->page->page_options['medias'])).
							' <a href="index.php?module=modifierPage&page_id='.$this->page->page_id.'&tab=ajoutImages">'.
								__('Ajouter des images').
							'</a> | '.
							' <a href="index.php?module=modifierPage&page_id='.$this->page->page_id.'&tab=organiserImages">'.
								__('Organiser les images').
							'</a>'.
						'</p>'.
						'<p class="onTop">'.
							'<label for="images_par_page">'.__('Images par page').'</label>'.
							$module->field('images_par_page', 4, 4, $images_par_page).
						'</p>'.
						'<p class="onTop">'.
							'<label for="miniature_titre">'.__('Afficher un titre pour les miniatures').'</label>'.
							$module->combo('miniature_titre', array(__('Oui') => 1, __('Non') => 0), $miniature_titre).
						'</p>'.
						'<p class="onTop">'.
							'<label for="miniature_taille">'.__('Taille des miniatures').'</label>'.
							form::field('miniature_taille', 4, 4, $miniature_taille).' px';
			$html.= isset($module->erreursFormulaire['miniature_taille']) ? 
							'<span class="erreur">'.$module->getErreurFormulaire('miniature_taille').'</span>' : '';				
			$html.=				
						'</p>'.
						'<p class="onTop">'.
							'<label for="image_taille">'.__('Taille des images agrandies').'</label>'.
							form::field('image_taille', 4, 4, $image_taille).' px';
			$html.= isset($module->erreursFormulaire['image_taille']) ? 
							'<span class="erreur">'.$module->getErreurFormulaire('image_taille').'</span>' : '';
			$html.=
						'</p>'.
						'</fieldset>'.
						'<fieldset><legend>'.__('Page').'</legend>'.
						'<p class="onTop">'.
							'<label for="page_titre">'.__('Titre').'</label>'.
							$module->field('page_titre', 40, 250, html::escapeHTML($page_titre)).
						'</p>'.
						'<p class="onTop">'.
							'<label for="page_entete">'.__('En-tête').'</label>'.
							$module->textArea('page_entete', 40, 15, html::escapeHTML($page_entete), 'tinymce').
						'</p>'.
						'</fieldset>'.
					'</div>'.
					'<div id="modifierPage_droite">'.$this->adminProprietesHTML($module).'</div>'.
				'</form>';
				
		break;
		
		case ajoutImages:
			$page = isset($_GET['page']) ? (integer) $_GET['page'] : 1;
		
			$html = 
				'<form id="formulaireAlbum">'.
					form::hidden('action', '').
					form::hidden('page_id', $this->page->page_id).
					'<div id="medias_ids"></div>'.
				'</form>'.
				$this->listeMedias->afficherFiltres().
				$this->listeMedias->afficherListe($page, CP_ADMIN_ITEMS_PAR_PAGE_MEDIAS, 
				$this->afficherMessages().
				'%s');	
		break;
		
		case organiserImages;
		
			$mediasT = array();
			if(count($this->page->page_options['medias']) != 0) {
				$mediasT = $this->core->site->getMedias(array('media_id' => array('=' => $this->page->page_options['medias'])), CP_GET_STATIC);
			}
		
			# Si l'album ne contient aucune image:
			if(count($mediasT) == 0) {
				$this->ajouterMessageInfo(sprintf(__('L\'album ne contient aucune image.').' <a href="%s">'.__('Ajouter des images').'</a>', 'index.php?module=modifierPage&page_id='.$this->page->page_id.'&tab=ajoutImages'));
				return $this->afficherMessages();
			}
			
			$medias = array();
			while($mediasT->fetch()) {
				$medias[$mediasT->media_id] = $mediasT->objet();
			}
			
			unset($mediasT);
			
			$html =
			$this->afficherMessages().
			'<p>'.__('Voici les images contenues dans cet album. Vous pouvez changer l\'ordre dans lequel elles sont présentées '.
			'par glisser-déposer, ou encore retirer une image en cliquant sur le lien «Retirer» qui l\'accompagne.').'</p>'.
			'<form id="formulaireOrganiserImages" action="index.php?module=modifierPage&page_id='.$this->page->page_id.'&tab=organiserImages" method="post">'.
				form::hidden('page_id', $this->page->page_id).
				$this->core->nonceHTML('organiserImages').
				form::hidden('action', 'organiserImages').
				form::hidden('page_id', $this->page->page_id).
			'<div id="organiserImages">';
			
			foreach($this->page->page_options['medias'] as $media_id)
			{
				if(array_key_exists($media_id,$medias)) {
					$html.=
					'<div class="media" name="'.$medias[$media_id]->media_id.'">'.
						form::hidden('media_id[]', $medias[$media_id]->media_id).
						'<img src="'.$medias[$media_id]->icone().'" alt="'.html::escapeHTML($medias[$media_id]->media_titre).'" />'.
						'<p class="media_titre"><a href="index.php?module=modifierMedia&media_id='.(integer) $medias[$media_id]->media_id.'&ref=1">'.html::escapeHTML($medias[$media_id]->media_titre).'</a></p>'.
						'<p class="media_fichier">'.html::escapeHTML($medias[$media_id]->media_fichier).'</p>'.
						'<p class="actionMedia"><a class="retirerImg" href="#">'.__('Retirer').'</a></p>'.
					'</div>';
				}
			}
			
			$html.=
			'</div>'.
			'</form>';
		
		break;
		
		endswitch;
		
		return $html;
	}
	
	
	public function curseurNouvellePage($cur)
	{
		
		parent::curseurNouvellePage($cur);
		
		$cur->page_options = array_merge($cur->page_options, array(
			'medias'			=> array(),
			'miniature_taille'	=> 150,
			'image_taille'		=> 500,
			'images_par_page'	=> 30,
			'miniature_titre'	=> false
		));
		
	}
	
	
	public function publier()
	{
		
		# Enregistrer la liste des médias
		$this->medias = $this->page->page_options['cp']['medias'];
		
		foreach($this->page->page_options['medias'] as $media_id)
		{
			$this->medias[] = array($media_id, (integer) $this->page->page_options['miniature_taille']);
			$this->medias[] = array($media_id, (integer) $this->page->page_options['image_taille']);
		}
		
		$this->adminEnregistrerMediasPage();
		
		# Mots
		$mots = html::clean($this->page->page_titre.' '.$this->page->page_entete_xhtml);
		$this->page->page_mots	= implode(' ', text::splitWords(text::toUTF8(html_entity_decode($mots))));
		
		# Publier la page
		parent::publier();
		
	}
	//@}
	
	
	
	
	
	/// @name Public
	//@{
	
	
	public $mode;
	public $media;
	public $i;
	public $albumMedias;
	public $pager;
	
	
	public function initPublic()
	{
		
		$param = $_GET[1];
		if($param == '') {
			$param = 'page-1';
		}

		$mediasT = $this->core->site->getMedias(array('media_id' => array('=' => $this->page->page_options['medias'])), CP_GET_STATIC);
		$medias = array();
		while($mediasT->fetch()) {
			$medias[$mediasT->media_id] = $mediasT->objet();
		}
		unset($mediasT);
		
		$this->albumMedias = array();
		
		foreach($this->page->page_options['medias'] as $k => $v)
		{
			if(isset($medias[$v])) {
				$this->albumMedias[] = $medias[$v];
				unset($medias[$v]);
			}
		}
		
		# Zoom sur une image
		if(preg_match('#^image-([0-9]+)$#', $param, $m))
		{
			
			$this->mode = 'zoom';

			$k = (integer) $m[1];
			$k--;
			if(!array_key_exists($k, $this->albumMedias)) {
				cpPublic::erreur404();
			}
			
			$this->media = $this->albumMedias[$k];
			$this->i = $k;
						
		}
		# Page de miniatures
		elseif(preg_match('#^page-([0-9]+)$#', $param, $m))
		{
			
			$this->mode = 'miniatures';
			$page = (integer) $m[1];
			
			if(count($this->albumMedias) != 0)
			{
				
				if(ceil(count($this->albumMedias)/$this->page->page_options['images_par_page']) < $page) {
					cpPublic::erreur404();
				}
				
				$this->pager = new pager($page,count($this->albumMedias),$this->page->page_options['images_par_page'],10);
				$this->pager->html_prev = __('&#171;préc.');
				$this->pager->html_next = __('suiv.&#187;');
				$this->pager->base_url = !$this->core->public->apercu ?
					CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',page-%1$d#contenu' :
					CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',page-%1$d?apercu=1#contenu';
				
			}
			
		}
		else
		{
			cpPublic::erreur404();
		}

		parent::initPublic();
	
	}
	
	
	public function public_head()
	{
		$css =
		'<style type="text/css">
			.album-miniature {
				width:'.(integer) $this->page->page_options['miniature_taille'].'px;
			}
			.album-miniature img {
				max-width:'.(integer) $this->page->page_options['miniature_taille'].'px;
				max-height:'.(integer) $this->page->page_options['miniature_taille'].'px;
			}
			.album-miniature-img-wrapper {
				display:block;
				width:'.(integer) $this->page->page_options['miniature_taille'].'px;
				height:'.(integer) $this->page->page_options['miniature_taille'].'px;
			}
			.album-zoom-img {
				max-width:'.(integer) $this->page->page_options['image_taille'].'px;
				max-height:'.(integer) $this->page->page_options['image_taille'].'px;
			}
		</style>';
		
		return $css;
	}
	
	
	public function public_entete()
	{
		if($this->mode == 'miniatures') {
			return $this->page->page_entete_xhtml;
		}
		return '';
	}
	
	
	public function public_contenu()
	{
		switch($this->mode):
		
		case miniatures:
			
			if(count($this->albumMedias) == 0) {
				return '<p>'.__('Cet album ne contient pas d\'image.').'</p>';
			}
			
			$html =
			'<div class="album-miniatures">';
					
			for($i=$this->pager->index_start;$i<=$this->pager->index_end;$i++)
			{
				
				$url_zoom = !$this->core->public->apercu ?
					CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',image-%s#contenu' :
					CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',image-%s?apercu=1#contenu';
				
				$html.=
				'<a href="'.sprintf($url_zoom, $i+1).'" class="album-miniature">'.
					'<span class="album-miniature-img-wrapper">'.
					'<img src="'.$this->albumMedias[$i]->publicURL().'?s='.$this->page->page_options['miniature_taille'].'" alt="'.html::escapeHTML($this->albumMedias[$i]->media_titre).'" title="'.html::escapeHTML($this->albumMedias[$i]->media_titre).'" />'.
					'</span>';
				
				if($this->page->page_options['miniature_titre']) {
					$html.=
					'<span class="album-miniature-titre">'.html::escapeHTML($this->albumMedias[$i]->media_titre).'</span>';
				}
				
				$html.=
				'</a>';
			}
			
			$html.=
			'</div>';
			
			$html.=ceil(count($this->albumMedias)/$this->page->page_options['images_par_page']) != 1 ?
				'<p class="album-miniatures-pages">'.$this->pager->getLinks().'</p>' : '';
			
		break;
		
		case zoom:
			
			$html =
			'<span class="album-zoom-img-wrapper">'.
				'<img class="album-zoom-img" src="'.$this->media->publicURL().'?s='.$this->page->page_options['image_taille'].'" />'.
			'</span>'.
			'<h3 class="album-zoom-titre">'.html::escapeHTML($this->media->media_titre).'</h3>';
			
			if(!empty($this->media->media_description)) {
				$html.=
				'<div class="album-zoom-description">'.$this->media->media_description.'</div>';
			}
			
			$html.=
			'<ul class="album-zoom-liens">';
			
			# Précédent
			if($this->i > 0) {
				
				$url_precedent = !$this->core->public->apercu ?
					CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',image-%s#contenu' :
					CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',image-%s?apercu=1#contenu';
				
				$html.=
				'<li class="album-prec">'.
					'<a href="'.sprintf($url_precedent, $this->i).'">'.__('&#171; Image précédente').'</a>'.
				'</li>';
				
			}
			
			# Retour galerie
			$url_retour = !$this->core->public->apercu ?
				CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',page-%s#contenu' :
				CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',page-%s?apercu=1#contenu';
					
			$page = ceil(($this->i+1)/$this->page->page_options['images_par_page']);
			
			$html.=
				'<li class="album-retour">'.
					'<a href="'.sprintf($url_retour, $page).'">'.__('Retour album').'</a>'.
				'</li>';
			
			# Suivant
			if($this->i+1 < count($this->albumMedias)) {
				
				$url_suivant = !$this->core->public->apercu ?
					CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',image-%s#contenu' :
					CP_URL_PUBLIQUE_RELATIVE.$this->page->page_url.',image-%s?apercu=1#contenu';
				
				$html.=
				'<li class="album-suiv">'.
					'<a href="'.sprintf($url_suivant, $this->i+2).'">'.__('Image suivante &#187;').'</a>'.
				'</li>';
			}
			
			$html.=
			'</ul>';
			
		break;
		
		endswitch;
		
		return $html;
		
	}
	
	
	public function getContexteCommentaires()
	{
		return (integer) $this->media->media_id;
	}
	
	
	public function commentairesActifs()
	{
		if(	in_array($this->page->page_commentaires, array(CP_COMMENTAIRES_ACTIFS, CP_COMMENTAIRES_PERMISSION)) &&
			$this->mode == 'zoom'
		) {
			return true;
		}
		return false;
	}
	//@}
	
	
}

?>